/*!
 * \file frreport_session_comm.h
 *
 * \brief 上报信息缓存共通管理
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * 关联连接共通管理
 *
 * \version 2.0
 * \author yaohl
 * \date 2016/03/03
 *
 */

#ifndef __FRREPORT_SESSION_COMM_H_
#define __FRREPORT_SESSION_COMM_H_

/*! @brief 管理数据包 */
typedef struct __st_report_session_data {
    int i_l7_proto;                     /*!< l7 协议号 */
    struct timeval st_timeval_upd;      /*!< 数据包最后时间 */
    void *p_data;                       /*!< report需要管理的数据 */
} Frreport_session_data;


typedef void(*pf_report_session_data_free)(void** p_data);

/*!
 * 模块首次使用时,必须初始化释放函数,框架在timeout时使用该函数
 *
 * \param p_frame_ref       (框架引用信息)
 * \param i_l7_proto        (l7代号)
 * \param list_node_free    (节点释放函数)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frreport_session_set(void* p_frame_ref, int i_l7_proto, pf_report_session_data_free pf_free);

/*!
 * 增加主机服务信息
 *
 * \param p_frame_ref  (框架引用信息)
 * \param i_l7_proto   (l7代号)
 * \param p_key        (key)
 * \param ui_key_len   (key数据长度)
 * \param p_data       (附加信息,直接引用该内存地址)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frreport_session_put(void* p_frame_ref, int i_l7_proto, const char *p_key, unsigned int ui_key_len, void *p_data);

/*!
 * 获取信息,内容从管理链表里脱离,p_data必须手工释放
 *
 * \param p_frame_ref  (框架引用信息)
 * \param i_l7_proto   (l7代号)
 * \param p_key        (key)
 * \param ui_key_len   (key数据长度)
 *
 * \return 成功:put时的p_data数据\n
 *         失败:NULL
 *
 * \note p_data内存空间需要外部释放
 */
void *frreport_session_get(void* p_frame_ref, int i_l7_proto, const char *p_key, unsigned int ui_key_len);


#endif
